local socket = require "client.socket"
require("src.class")

-- 工具函数
function string_split(inputstr, sep)
    if sep == nil then sep = "%s" end
    local t = {}
    for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do
        table.insert(t, str)
    end
    return t
end

-- 工具函数:以阻塞方式读取服务器返回内容,延迟上限n秒
function readServer(n, fd)
    -- print(fd)
    local n = n or 1
    local elapsed = 0
    while elapsed < n * 100000 do
        local res = socket.recv(fd)
        if res ~= nil and res ~= "" then
            return res
        else
            elapsed = elapsed + 1000
            socket.usleep(1000)
        end
    end
    return nil
end

-- 以阻塞方式读取用户输入
function readStdin()
    local stdin = nil
    while stdin == nil do stdin = socket.readstdin() end
    return stdin
end

-- 阻塞地要求输入数字
function readStdinNumber()
    local stdin = nil
    stdin = readStdin()
    while tonumber(stdin) == nil do
        print("请输入数字")
        stdin = readStdin()
    end
    return tonumber(stdin)
end

Queue = class("Queue")

function Queue:ctor()
    -- tail指向最后一个进入的，head指向下一个要取出的
    self.tab = {}
    self.tail = 0
    self.head = 0
end

function Queue:Enqueue(value)
    if self.tail == 0 then self.head = 1 end
    self.tail = self.tail + 1
    self.tab[self.tail] = value
end

function Queue:Dequeue()
    if self.head > self.tail then
        -- 已经空了
        return nil
    else
        local value = self.tab[self.head]
        self.tab[self.head] = nil
        self.head = self.head + 1
        return value
    end
end

function Queue:Peek()
    if self.head > self.tail then
        return nil
    else
        return self.tab[self.head]
    end
end

function Queue:Count() return self.tail - self.head + 1 end

function Queue:Clear() table.ClearArray(self.tab) end
